package com.eudon.design_pattern.behavioral.visitor;

/**
 * @author eudon
 * @description 抽象资源文件类 - 访问者模式中的抽象元素
 * @date 2025/9/3
 * @email syd19970616@gmail.com
 * @address <a href="https://gitee.com/eudon">Gitee</a>
 */
public abstract class ResourceFile {
    /**
     * 文件名
     */
    protected String fileName;
    
    /**
     * 文件大小（字节）
     */
    protected long fileSize;
    
    /**
     * 构造函数
     * @param fileName 文件名
     * @param fileSize 文件大小
     */
    public ResourceFile(String fileName, long fileSize) {
        this.fileName = fileName;
        this.fileSize = fileSize;
    }
    
    /**
     * 接受访问者的方法 - 访问者模式的核心方法
     * 这个方法实现了双分派机制：
     * 1. 第一次分派：根据当前对象类型调用对应的accept方法
     * 2. 第二次分派：在accept方法中调用visitor的visit方法，根据visitor类型执行具体操作
     * 
     * @param visitor 访问者对象
     */
    public abstract void accept(Visitor visitor);
    
    // Getter方法
    public String getFileName() {
        return fileName;
    }
    
    public long getFileSize() {
        return fileSize;
    }
    
    /**
     * 获取文件类型
     * @return 文件类型字符串
     */
    public abstract String getFileType();
    
    @Override
    public String toString() {
        return String.format("%s文件: %s (大小: %d字节)", getFileType(), fileName, fileSize);
    }
}